/**
 * @author 王晓伟
 * @version 0.1
 * @class Ext.ux.grid.GridPanel对EXTJS的Ext.grid.GridPanel组件进行了扩展。
 * 这个组件已经不用像Ext.grid.GridPanel那样初始化时需要提供一个store了，组件自身
 * 在初始化的时候通过遍历ColumnModel（组件的列）自行初始化一个store了（一个JSONstore）
 * 目前此组件只支持JSON作为数据源。最终开发人员只需要提供一个selectUrl，即服务器端数据查询
 * 的URL就可以实现数据的加载。此组件还提供了一个deleteUrl，利用它和组件的deleteSelectedRowData
 * 方法可以删除用户选中的行的数据。当然deleteUrl就是服务器端的删除操作的URL。最后强烈不建议使用
 * 此组件与Ext.PagingToolbar配合进行分页处理。此组件由于目前对数据系统进行封装所以尚不能完全
 * 适用于分页操作。后面我会推出相应的封装了分页功能的grid组件。
 * @config 配置参数是一个JSON对象{object}
 * @extends Ext.grid.GridPanel
 * @example 
 * var _grid = new Ext.ux.grid.GridPanel({
		cm:_cm,
		renderTo:'grid',
		selectUrl:Ext.get('basePath').getValue() + 'userinfoaction.do?method=selectUserinfo',
		deleteUrl:Ext.get('basePath').getValue() + 'userinfoaction.do?method=deleteUserinfo',
		title:Ext.userinfoListTitleText
	});
 * 
 * 
 * 
 * 
 */
Ext.ns('Ext.ux.grid');
Ext.ux.grid.GridPanel = Ext.extend(Ext.grid.GridPanel,{
	border:false,
	height:Ext.getBody().dom.clientHeight,
	width:Ext.getBody().dom.clientWidth,
	/**
	 * 与服务器端配合删除的URL
	 * @type String
	 */
	deleteUrl:'',
	/**
	 * 与服务器端配合查询的URL
	 * @type String
	 */
	selectUrl:'',
	loadMask:true,
	viewConfig:{
    	forceFit:true
    },
    sm: new Ext.grid.RowSelectionModel({
    	singleSelect:true
    }),
	initComponent:function() {
		Ext.ux.grid.GridPanel.superclass.initComponent.call(this);
		/**
		 * 通过遍历列自动生成store
		 */
		if(this.selectUrl!=''){
			var _cmarray =	this.getColumnModel().getColumnsBy(function(_config,_index){
				return true;
			});	
			var _fieldsarray = new Array();
			for(var i = 0;i<_cmarray.length;i++){
				_fieldsarray.push(_cmarray[i].dataIndex);
			} 
			this.store = new Ext.data.JsonStore({
				fields:_fieldsarray,
				url:Ext.get('basePath').getValue() + 'userinfoaction.do?method=selectUserinfo',
				url:this.selectUrl,
				autoLoad:true
			});
		}
	},
	/**
	 * private 返回要删除的数据
	 * @param {一个record对象} _record
	 * @return {一个JSON对象}
	 */
	deleteData: function(_record){
		return  _record.data;
		
	},
	/**
	 * 删除选中的第一行
	 */
	deleteSelectedRowData: function(){
		var _selectedRowData =  this.getSelections();
		if(this.sm.singleSelect){
			var _data = this.deleteData(_selectedRowData[0]);
			Ext.Ajax.request({
				 url: this.deleteUrl,
				 method:'POST', 
				 params:_data,
				 scope :this,
				 success:function(response,options){
				 	Ext.Msg.show({
				 		title : Ext.definetitle,
				 		msg   : Ext.decode(response.responseText).msg,
				 		buttons: Ext.Msg.OK,
				 		scope : this, 
				 		fn    : function(_id){
				 			this.getStore().reload();	
				 		}
				 	})
				 }
			})
		}
	},
	/**
	 * 删除选中的所有行
	 */
	deleteAllSelectedRowData: function(){
		var _selectedRowData =  this.getSelections();
		for(var i=0;i<_selectedRowData.length;i++){
					var _data = this.deleteData(_selectedRowData[i]);
					Ext.Ajax.request({
						 url: this.deleteUrl,
						 method:'POST', 
						 params:_data,
						 scope :this,
						 success:function(response,options){
						 	Ext.Msg.show({
						 		title : Ext.definetitle,
						 		msg   : Ext.decode(response.responseText).msg,
						 		buttons: Ext.Msg.OK,
						 		scope : this, 
						 		fn    : function(_id){
						 			this.getStore().reload();	
						 		}
						 	})
						 }
					});	
		}
	},
	/**
	 * 重新加载数据
	 */
	reload: function(){
		this.store.reload();
	},
	/**
	 * 返回选中的第一行数据
	 * @return {一个record对象}
	 */
	getSelectFirstRow:function(){
		return this.getSelections()[0];
	},
	/**
	 * 返回选中的所有数据
	 * @return {一个record对象数组}
	 */
	getAllSelectRow:function(){
		return this.getSelections();
	}
});
Ext.reg('uxgridPanel',Ext.ux.grid.GridPanel);